"""
CSV数据查看器
用于查看和分析生成的CSV数据
"""

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import os
from datetime import datetime

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def load_csv_data(filepath):
    """
    加载CSV数据
    """
    try:
        df = pd.read_csv(filepath, index_col=0, parse_dates=True)
        print(f"成功加载数据: {filepath}")
        print(f"数据形状: {df.shape}")
        print(f"时间范围: {df.index.min()} 到 {df.index.max()}")
        return df
    except Exception as e:
        print(f"加载数据失败: {e}")
        return None

def display_data_summary(df, title="数据摘要"):
    """
    显示数据摘要
    """
    print(f"\n{title}")
    print("=" * 50)
    print(f"数据行数: {len(df)}")
    print(f"数据列数: {len(df.columns)}")
    print(f"时间范围: {df.index.min()} 到 {df.index.max()}")
    print(f"时间间隔: {df.index[1] - df.index[0]}")
    
    print("\n主要参数统计:")
    print("-" * 30)
    key_columns = ['机组负荷_MW', '主汽流量_t_h', '主汽压力_MPa', '主汽温度_℃', 
                   '背压_kPa', '环境温度_℃', '风机转速_rpm']
    
    for col in key_columns:
        if col in df.columns:
            print(f"{col}:")
            print(f"  平均值: {df[col].mean():.2f}")
            print(f"  最大值: {df[col].max():.2f}")
            print(f"  最小值: {df[col].min():.2f}")
            print(f"  标准差: {df[col].std():.2f}")

def plot_key_parameters(df, title="关键参数趋势"):
    """
    绘制关键参数趋势图
    """
    fig, axes = plt.subplots(3, 2, figsize=(15, 12))
    fig.suptitle(title, fontsize=16)
    
    # 机组负荷
    if '机组负荷_MW' in df.columns:
        axes[0, 0].plot(df.index, df['机组负荷_MW'], 'b-', linewidth=1)
        axes[0, 0].set_title('机组负荷 (MW)')
        axes[0, 0].set_ylabel('负荷 (MW)')
        axes[0, 0].grid(True, alpha=0.3)
    
    # 主汽流量
    if '主汽流量_t_h' in df.columns:
        axes[0, 1].plot(df.index, df['主汽流量_t_h'], 'r-', linewidth=1)
        axes[0, 1].set_title('主汽流量 (t/h)')
        axes[0, 1].set_ylabel('流量 (t/h)')
        axes[0, 1].grid(True, alpha=0.3)
    
    # 背压
    if '背压_kPa' in df.columns:
        axes[1, 0].plot(df.index, df['背压_kPa'], 'g-', linewidth=1)
        axes[1, 0].set_title('背压 (kPa)')
        axes[1, 0].set_ylabel('背压 (kPa)')
        axes[1, 0].grid(True, alpha=0.3)
    
    # 环境温度
    if '环境温度_℃' in df.columns:
        axes[1, 1].plot(df.index, df['环境温度_℃'], 'orange', linewidth=1)
        axes[1, 1].set_title('环境温度 (℃)')
        axes[1, 1].set_ylabel('温度 (℃)')
        axes[1, 1].grid(True, alpha=0.3)
    
    # 风机转速
    if '风机转速_rpm' in df.columns:
        axes[2, 0].plot(df.index, df['风机转速_rpm'], 'purple', linewidth=1)
        axes[2, 0].set_title('风机转速 (rpm)')
        axes[2, 0].set_ylabel('转速 (rpm)')
        axes[2, 0].grid(True, alpha=0.3)
    
    # 主汽温度
    if '主汽温度_℃' in df.columns:
        axes[2, 1].plot(df.index, df['主汽温度_℃'], 'brown', linewidth=1)
        axes[2, 1].set_title('主汽温度 (℃)')
        axes[2, 1].set_ylabel('温度 (℃)')
        axes[2, 1].grid(True, alpha=0.3)
    
    # 设置x轴格式
    for ax in axes.flat:
        ax.tick_params(axis='x', rotation=45)
    
    plt.tight_layout()
    return fig

def plot_correlation_matrix(df, title="参数相关性矩阵"):
    """
    绘制参数相关性矩阵
    """
    # 选择数值型列
    numeric_columns = df.select_dtypes(include=[np.number]).columns
    correlation_matrix = df[numeric_columns].corr()
    
    fig, ax = plt.subplots(figsize=(12, 10))
    im = ax.imshow(correlation_matrix, cmap='coolwarm', vmin=-1, vmax=1)
    
    # 添加颜色条
    cbar = ax.figure.colorbar(im, ax=ax)
    cbar.ax.set_ylabel('相关系数', rotation=-90, va="bottom")
    
    # 设置刻度标签
    ax.set_xticks(np.arange(len(correlation_matrix.columns)))
    ax.set_yticks(np.arange(len(correlation_matrix.columns)))
    ax.set_xticklabels(correlation_matrix.columns, rotation=45, ha='right')
    ax.set_yticklabels(correlation_matrix.columns)
    
    # 添加相关系数文本
    for i in range(len(correlation_matrix.columns)):
        for j in range(len(correlation_matrix.columns)):
            text = ax.text(j, i, f'{correlation_matrix.iloc[i, j]:.2f}',
                          ha="center", va="center", color="black")
    
    ax.set_title(title)
    plt.tight_layout()
    return fig

def analyze_scenario_comparison(csv_dir='csv_data'):
    """
    分析不同场景的数据对比
    """
    scenarios = ['normal', 'high_load', 'low_load', 'high_temp', 'low_temp']
    scenario_data = {}
    
    # 加载所有场景数据
    for scenario in scenarios:
        filepath = os.path.join(csv_dir, f"thermal_plant_data_{scenario}.csv")
        if os.path.exists(filepath):
            df = load_csv_data(filepath)
            if df is not None:
                scenario_data[scenario] = df
    
    if not scenario_data:
        print("未找到场景数据文件")
        return
    
    # 创建对比图
    fig, axes = plt.subplots(2, 2, figsize=(15, 12))
    fig.suptitle('不同工况参数对比', fontsize=16)
    
    # 机组负荷对比
    ax1 = axes[0, 0]
    for scenario, df in scenario_data.items():
        if '机组负荷_MW' in df.columns:
            ax1.plot(df.index, df['机组负荷_MW'], label=scenario, linewidth=1)
    ax1.set_title('机组负荷对比')
    ax1.set_ylabel('负荷 (MW)')
    ax1.legend()
    ax1.grid(True, alpha=0.3)
    
    # 背压对比
    ax2 = axes[0, 1]
    for scenario, df in scenario_data.items():
        if '背压_kPa' in df.columns:
            ax2.plot(df.index, df['背压_kPa'], label=scenario, linewidth=1)
    ax2.set_title('背压对比')
    ax2.set_ylabel('背压 (kPa)')
    ax2.legend()
    ax2.grid(True, alpha=0.3)
    
    # 环境温度对比
    ax3 = axes[1, 0]
    for scenario, df in scenario_data.items():
        if '环境温度_℃' in df.columns:
            ax3.plot(df.index, df['环境温度_℃'], label=scenario, linewidth=1)
    ax3.set_title('环境温度对比')
    ax3.set_ylabel('温度 (℃)')
    ax3.legend()
    ax3.grid(True, alpha=0.3)
    
    # 风机转速对比
    ax4 = axes[1, 1]
    for scenario, df in scenario_data.items():
        if '风机转速_rpm' in df.columns:
            ax4.plot(df.index, df['风机转速_rpm'], label=scenario, linewidth=1)
    ax4.set_title('风机转速对比')
    ax4.set_ylabel('转速 (rpm)')
    ax4.legend()
    ax4.grid(True, alpha=0.3)
    
    # 设置x轴格式
    for ax in axes.flat:
        ax.tick_params(axis='x', rotation=45)
    
    plt.tight_layout()
    return fig

def main():
    """
    主函数
    """
    print("=" * 60)
    print("热电厂冷端优化系统 - CSV数据查看器")
    print("=" * 60)
    
    csv_dir = 'csv_data'
    
    if not os.path.exists(csv_dir):
        print(f"CSV数据目录不存在: {csv_dir}")
        print("请先运行 generate_csv_data.py 生成数据")
        return
    
    # 列出可用的CSV文件
    csv_files = [f for f in os.listdir(csv_dir) if f.endswith('.csv')]
    if not csv_files:
        print("未找到CSV文件")
        return
    
    print(f"找到 {len(csv_files)} 个CSV文件:")
    for i, file in enumerate(csv_files, 1):
        print(f"{i}. {file}")
    
    # 分析历史数据
    historical_file = os.path.join(csv_dir, "thermal_plant_historical_data.csv")
    if os.path.exists(historical_file):
        print(f"\n分析历史数据...")
        df_historical = load_csv_data(historical_file)
        if df_historical is not None:
            display_data_summary(df_historical, "历史数据摘要")
            
            # 绘制趋势图
            fig1 = plot_key_parameters(df_historical, "历史数据关键参数趋势")
            fig1.savefig(os.path.join(csv_dir, "historical_trends.png"), dpi=300, bbox_inches='tight')
            
            # 绘制相关性矩阵
            fig2 = plot_correlation_matrix(df_historical, "历史数据参数相关性")
            fig2.savefig(os.path.join(csv_dir, "historical_correlation.png"), dpi=300, bbox_inches='tight')
            
            plt.show()
    
    # 分析场景对比
    print(f"\n分析场景对比...")
    fig3 = analyze_scenario_comparison(csv_dir)
    if fig3:
        fig3.savefig(os.path.join(csv_dir, "scenario_comparison.png"), dpi=300, bbox_inches='tight')
        plt.show()
    
    print(f"\n分析完成！图表已保存到 {csv_dir} 目录")

if __name__ == "__main__":
    main() 